{ 
  Variáveis externas disponíveis: 
    Output: string; 
    Datasets: TspdXSDDataset;
}
{$I Tipos.txt}  
Var	
	_Rejeicoes,_Handles, _output : TstringList;
	_regrasCFOP,_regrasCEP,_xml,_nota, _validacao : string;	
	_auxint, _numnotas, i : integer;

{$I Funcoes.txt}
{$I FuncoesUsuario.txt}
{$I CST_CFOP\Regras.txt}	

{$I CEP\ExecutaRegras.txt}
{$I ..\Esquemas\ExpConsts.txt}
{$I ..\Esquemas\Funcoes.txt}
{$I ..\Esquemas\DefineMensagem.txt}

{$I RegrasManualSefaz401\ExecutaRegras.txt}
{$I NT004\ExecutaRegras.txt}
{$I UpdateDETDatasets.txt}
{$I NT005\ExecutaRegras.txt}
{$I NT2012.003\ExecutaRegras.txt}
{$I AliquotaPorEstado\ExecutaRegras.txt}
	
function GetVersaoXML: String;
begin
  Result := Params.Values['versao'];
end;

begin
	_Rejeicoes := TstringList.Create;
	_Handles := TstringList.Create;
	_output := TstringList.Create;
	try
		_xml := input;
		_numnotas :=  XmlSelectCountNode(_Xml, '//*[local-name()="NFe"]');
		for i := 0 to _numnotas-1 do	
		begin
			_nota := XmlSelectItemIndexNode(_xml, '//*[local-name()="NFe"]',i); 
			Datasets.LoadFromXMLContent(_nota);			
			_validacao := ValidarEsquemaXML(_nota,'http://www.portalfiscal.inf.br/nfe',Datasets.XsdFile);
			if trim(_validacao) = '' then
			begin				
				// os regras do cliente serão inseridas aqui
				if GetVersaoXML = 'pl_006g' then 
				  _Rejeicoes.Add(Trim(ExecutaRegrasManualSefaz401()))
				else if GetVersaoXML = 'pl_006j' then
					_Rejeicoes.Add(Trim(ExecutaRegrasNT005()))
				else if GetVersaoXML = 'pl_006m' then
					_Rejeicoes.Add(Trim(ExecutaRegrasNT2012_003()))	
				else
					_Rejeicoes.Add(Trim(ExecutaRegrasNT004()));

				_Rejeicoes.text := Trim(_Rejeicoes.text);
				if _Rejeicoes.text = '' then
						_Rejeicoes.Add('XML Válido');
					
				// Valida as Alertas
				_regrasCFOP := Trim(ValidarRegrasCFOP);
				if _regrasCFOP <> '' then
					_Rejeicoes.Add(_regrasCFOP);
				
				_regrasCEP := Trim(ExecutaRegrasCep);
				if _regrasCEP <> '' then
					_Rejeicoes.add(_regrasCEP);
		
				if not IsValidSignature(_nota) then
					_Rejeicoes.add('Assinatura inválida');
				if (Trim(_Rejeicoes.text) = '') or (PosStr('rejeição',LowerCase(_Rejeicoes.Text)) <= 0) then
					_Rejeicoes.Add('XML Válido');
			end else
			begin				
				_Rejeicoes.add(TraduzirMensagem(_validacao));
			end;
			_output.add(Trim(_Rejeicoes.Text) + '&spdHandleDlmt;' + Trim(_Handles.Text)+'&spdDlmt;');
		end;			
		Output := _output.text;
		_Rejeicoes.clear;
    finally
		_Rejeicoes.Free;
		_Handles.Free;
		_output.free;
	end;
end.
